#include <REGX52.H>

sbit OneWire_DQ = P3^7;

/**
  * @brief  单总线初始化
  * @param  无
  * @retval 从机响应位，0为响应，1为未响应
  */
unsigned char OneWire_Init() {
	unsigned char i, ack;
	OneWire_DQ = 1;
	OneWire_DQ = 0;
	i = 230; while (--i);	// 500us
	OneWire_DQ = 1;
	i = 32; while (--i);	// 70us
	ack = OneWire_DQ;
	i = 230; while (--i);	// 500us
	return ack;
}

/**
  * @brief  单总线发送一位
  * @param  Bit 要发送的位
  * @retval 无
  */
void OneWire_SendBit(unsigned char oneBit) {
	unsigned char i;
	OneWire_DQ = 0;
	i = 4; while (--i); // 10us
	OneWire_DQ = oneBit;
	i = 23; while (--i); // 50us
	OneWire_DQ = 1;
}

/**
  * @brief  单总线接收一位
  * @param  无
  * @retval 读取的位
  */
unsigned char OneWire_ReceiveBit() {
	unsigned char i, oneBit; 
	OneWire_DQ = 0;
	i = 2; while (--i); // 5us
	OneWire_DQ = 1;
	i = 4; while (--i); // 10us
	oneBit = OneWire_DQ;
	i = 23; while (--i); // 50us
	return oneBit;
}

/**
  * @brief  单总线发送一个字节
  * @param  Byte 要发送的字节
  * @retval 无
  */
void OneWire_SendByte(unsigned char byte) {
	unsigned char i;
	for (i = 0; i < 8; i++) {
		OneWire_SendBit((byte >> i) & 0x01);
	}
}

/**
  * @brief  单总线接收一个字节
  * @param  无
  * @retval 接收的一个字节
  */
unsigned char OneWire_ReceiveByte() {
	unsigned char i, byte = 0;
	for (i = 0; i < 8; i++) {
		byte |= OneWire_ReceiveBit() << i;
	}
	return byte;
}